<?php

declare(strict_types=1);

namespace DreamCat\StateMachine\Popo\Define;

use DreamCat\StateMachine\Enums\TransferType;

/**
 * 条件状态转移
 * @author vijay
 */
class SwitchTransfer extends TransferDetail
{
    /** @var string 描述条件判断的内容 */
    private string $name;
    /** @var string 条件判断类 */
    private string $class;
    /** @var bool 是否可以预执行判断 */
    private bool $canPreJudge;
    /** @var SwitchResult[] 可能的返回值列表，key是返回值 */
    private array $resultList = [];

    /**
     * SwitchTransfer constructor.
     */
    public function __construct()
    {
        $this->setTransferType(TransferType::SWITCH_TRANS());
    }

    /**
     * @return string 描述条件判断的内容
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name 描述条件判断的内容
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * @return string 条件判断类
     */
    public function getClass(): string
    {
        return $this->class;
    }

    /**
     * @param string $class 条件判断类
     */
    public function setClass(string $class): void
    {
        $this->class = $class;
    }

    /**
     * @return bool 是否可以预执行判断
     */
    public function isCanPreJudge(): bool
    {
        return $this->canPreJudge;
    }

    /**
     * @param bool $canPreJudge 是否可以预执行判断
     */
    public function setCanPreJudge(bool $canPreJudge): void
    {
        $this->canPreJudge = $canPreJudge;
    }

    /**
     * @return SwitchResult[] 可能的返回值列表
     */
    public function getResultList(): array
    {
        return $this->resultList;
    }

    /**
     * 获取目标节点名
     * @param string $funcReturn 判断函数返回值
     * @return string|null 目标节点，null表示无信息
     */
    public function getResultTarget(string $funcReturn): ?string
    {
        if (isset($this->resultList[$funcReturn])) {
            return $this->resultList[$funcReturn]->getTarget();
        } elseif ($this->resultList) {
            return null;
        } else {
            return $funcReturn;
        }
    }

    /**
     * 添加一个可能的返回值
     * @param SwitchResult $switchResult 返回值描述
     * @return SwitchResult|null 如果原本存在则返回旧的，否则返回null
     */
    public function addResult(SwitchResult $switchResult): ?SwitchResult
    {
        $tmp = $this->resultList[$switchResult->getResult()] ?? null;
        $this->resultList[$switchResult->getResult()] = $switchResult;
        return $tmp;
    }

    /**
     * 删除动作
     * @param string $switchResult 返回值
     * @return SwitchResult|null 如果原本存在则返回旧的，否则返回null
     */
    public function deleteResult(string $switchResult): ?SwitchResult
    {
        $tmp = $this->resultList[$switchResult] ?? null;
        unset($this->resultList[$switchResult]);
        return $tmp;
    }

    /**
     * 清除动作
     * @return SwitchResult[] 旧的动作列表
     */
    public function clearResult(): array
    {
        $list = $this->resultList;
        $this->resultList = [];
        return $list;
    }
}

# end of file
